home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / examples / crypt / crypt.s < prev   
Text File  |  1996-04-12  |  9KB  |  434 lines

  1. ;-------------------------------------------------------------------------------
  2. *                                                                              *
  3. * Crypt                                                                        *
  4. *                                                                              *
  5. * Written 1992,1993,1994 by Daniel Weber                                       *
  6. *                                                                              *
  7. * IMPORTANT NOTE                                                               *
  8. * --------------                                                               *
  9. * This is a naive encryption algorithm and elementary cryptanalytic techniques *
  10. * may easily crack it.  Stronger and more complex algorithms are recommended   *
  11. * for higher data security (f.e.: PGP (Pretty Good Privacy), ...).             *
  12. *                                                                              *
  13. *                                                                              *
  14. *       Filename        crypt.s                                                *
  15. *       Author          Daniel Weber                                           *
  16. *       Version         1.02                                                   *
  17. *       Start           1992                                                   *
  18. *                                                                              *
  19. *       Last Revision   11.10.93                                               *
  20. *                                                                              *
  21. ;-------------------------------------------------------------------------------
  22.  
  23.     output    'ram:crypt'
  24.  
  25.     opt    o+,q+,ow-,qw-,sw-
  26.     verbose
  27.     base    progbase
  28.  
  29.     filenote    'Crypt, Written 1992,1993,1994 by Daniel Weber'
  30.  
  31. ;-------------------------------------------------------------------------------
  32.  
  33.     incdir    'include:'
  34.     incdir    'routines:'
  35.  
  36.     include    'basicmac.r'
  37.     include    'support.mac'
  38.     incequ    'LVO.s'
  39.  
  40. ;-------------------------------------------------------------------------------
  41.  
  42. version        equr    "1.02"
  43. gea_progname    equr    "Crypt"
  44.  
  45. ;-- startup control  --
  46. cws_CLIONLY    set    1            ;for CLI usage only
  47. cws_EASYLIB    set    1
  48.  
  49.  
  50. ;-- user definitions --
  51. AbsExecBase    equ    4
  52. DOS.LIB        equ    1        ;startup code should open dos.library
  53.  
  54.  
  55. * cryptoffset is a user specified value to make 'crypt' a bit more individual.
  56. cryptoffset    equ    11
  57.  
  58.  
  59. workspace    equ    400
  60.  
  61.  
  62. ;-------------------------------------------------------------------------------
  63. progbase:
  64.     jmp    AutoDetach(pc)
  65.     dc.b    0,"$VER: ",gea_progname," ",version," (",__date2,")",0
  66.     even
  67.  
  68. ;----------------------------
  69. clistartup:
  70.     lea    progbase(pc),a5
  71.  
  72.     lea    dxstart(pc),a1
  73.     move.w    #(dxend-dxstart)/2-1,d7
  74. .clr:    clr.w    (a1)+
  75.     dbra    d7,.clr
  76.  
  77.     move.l    a0,ArgStr(a5)
  78.     move.l    d0,ArgLen(a5)
  79.  
  80.     lea    Title(pc),a0            ;print title
  81.     printtext_
  82.  
  83.     bsr    ReadParameters            ;read parameter line
  84.     bne.s    .exit                ;invalid
  85.  
  86.     move.l    Sourcefile(pc),d0        ;load source file
  87.     move.l    d0,d3
  88.     moveq    #0,d1
  89.     moveq    #0,d2
  90.     CALL_    LoadFile
  91.     move.l    d0,Buffer(a5)
  92.     beq.s    .fileerror
  93.     move.l    d1,Sourcelen(a5)
  94.     move.l    d2,BufferSize(a5)
  95.  
  96.     bsr    DoCrypt                ;encrypt buffer
  97.  
  98.     move.l    Destfile(pc),d0            ;save file
  99.     move.l    d0,d3
  100.     move.l    Buffer(pc),d1
  101.     move.l    Sourcelen(pc),d2
  102.     CALL_    WriteToFile
  103.     bne.s    .fileerror
  104.  
  105. .quit:    move.l    Buffer(pc),d0            ;free buffer
  106.     beq.s    .exit
  107.     move.l    d0,a1
  108.     move.l    BufferSize(pc),d0
  109.     move.l    4.w,a6
  110.     jsr    _LVOFreeMem(a6)
  111.  
  112. .exit:    moveq    #0,d0
  113.     bra    ReplyWBMsg
  114.  
  115.  
  116.  
  117. ;
  118. ; error handler
  119. ;
  120. .fileerror:                    ;couldn't open file '%s'
  121.     move.l    d3,rawlist(a5)
  122.     lea    FileError1(pc),a0
  123.     lea    rawlist(pc),a1    
  124.     lea    workbuffer(pc),a3
  125.     bsr    DoRawFmt
  126.     move.l    a3,a0
  127.     printtext_
  128.     bra    .quit
  129.  
  130.  
  131.  
  132. ;-------------------------------------------------------------------------------
  133. *
  134. * subroutines
  135. *
  136. ;-------------------------------------------------------------------------------
  137.  
  138. ;----------------------------------------------------------
  139. ;
  140. ; ReadParameters    - small command line parser
  141. ;
  142. ; a5: progbase
  143. ;
  144. ; => CCR:  Z ok,  zN failed usage, printed
  145. ;
  146. ReadParameters:
  147.     move.l    ArgStr(pc),a0
  148.     move.l    ArgLen(pc),d7
  149.     clr.b    -1(a0,d7.l)
  150.     bsr    .spacekiller
  151.  
  152.     cmp.b    #"?",(a0)            ;force usage?
  153.     bne.s    .pw
  154.     tst.b    1(a0)
  155.     beq.s    .usage
  156.     cmp.b    #" ",1(a0)
  157.     beq.s    .usage
  158.  
  159. .pw:    cmp.b    #"-",(a0)            ;password
  160.     seq    cryptflag(a5)
  161.     bne.s    1$
  162.     addq.l    #1,a0
  163. 1$:    move.l    a0,PassWdStart(a5)
  164.     move.l    a0,d1
  165.     bsr.s    .skip
  166.     move.l    a0,d0
  167.     sub.l    d1,d0
  168.     move.l    d0,PassWdLength(a5)
  169.     beq.s    .usage
  170.     clr.b    (a0)+
  171.  
  172. .src:    bsr.s    .spacekiller            ;source file
  173.     tst.b    (a0)
  174.     beq.s    .usage
  175.     move.l    a0,Sourcefile(a5)
  176.     bsr.s    .skip
  177.     add.l    d4,Sourcefile(a5)
  178.     sub.l    d4,a0
  179.     clr.b    (a0)+
  180.  
  181. .out:    bsr.s    .spacekiller            ;output file
  182.     tst.b    (a0)
  183.     beq.s    .usage
  184.     move.l    a0,Destfile(a5)
  185.     bsr.s    .skip
  186.     add.l    d4,Destfile(a5)
  187.     sub.l    d4,a0
  188.     clr.b    (a0)+
  189.  
  190.     bsr.s    .spacekiller
  191.     tst.b    (a0)
  192.     bne.s    .usage
  193.     rts
  194.  
  195. ;
  196. ; print usage
  197. ;
  198. .usage:    lea    Usage(pc),a0
  199.     printtext_
  200.     moveq    #-1,d0
  201.     rts
  202.  
  203. ;
  204. ; skip text
  205. ;
  206. ; => d4: correction
  207. ;
  208. .skip:    moveq    #0,d4
  209.     moveq    #0,d5
  210.     cmp.b    #$22,(a0)
  211.     bne.s    \do
  212. \strt:    move.b    (a0)+,d5
  213.     moveq    #1,d4
  214. \do:    move.b    (a0)+,d0
  215.     beq.s    \ends
  216.     cmp.b    d0,d5
  217.     bne.s    .d2
  218.     cmp.b    (a0)+,d5
  219.     bne.s    \ends
  220.  
  221. .d2:    cmp.b    #" ",d0
  222.     bne.s    \do
  223.     tst.b    d5
  224.     bne.s    \do
  225. \ends:    subq.l    #1,a0
  226.     rts
  227.  
  228.  
  229. ;
  230. ; skip spaces
  231. ;
  232. .spacekiller:
  233.     cmp.b    #" ",(a0)+
  234.     beq.s    .spacekiller
  235.     subq.l    #1,a0
  236.     rts
  237.  
  238.  
  239. ;----------------------------------------------------------
  240. ;
  241. ; DoRawFmt
  242. ;
  243. ; a0: format
  244. ; a1: data stream
  245. ; a3: dest. buffer
  246. ;
  247. DoRawFmt:
  248.     movem.l    d0-a6,-(a7)
  249.     lea    .setin(pc),a2
  250.     move.l    4.w,a6
  251.     jsr    _LVORawDoFmt(a6)
  252.     movem.l    (a7)+,d0-a6
  253.     rts
  254.  
  255. .setin:    move.b    d0,(a3)+
  256.     rts
  257.  
  258.  
  259.  
  260. ;----------------------------------------------------------
  261. ;
  262. ; DoCrypt    - encrypt buffer
  263. ;
  264. ; simple encryption algorithm
  265. ;
  266. ; crypt:   pass1-pass2-pass3
  267. ; decrypt:             pass3-pass4-pass5
  268. ;
  269. DoCrypt:
  270.     move.l    Sourcefile(pc),rawlist(a5)    ;print action text
  271.     move.l    Destfile(pc),rawlist+4(a5)
  272.     lea    CryptTxt(pc),a0
  273.     tst.b    cryptflag(a5)
  274.     beq.s    .crypt
  275.     lea    DeCryptTxt(pc),a0
  276. .crypt:    lea    rawlist(pc),a1
  277.     lea    workbuffer(pc),a3
  278.     bsr    DoRawFmt
  279.     move.l    a3,a0
  280.     printtext_
  281.  
  282.  
  283. ;------------------
  284.     tst.b    cryptflag(a5)
  285.     bne.s    .pass3
  286. .pass1:    move.l    Buffer(pc),a0            ;pass1 for encryption only
  287.     move.l    Sourcelen(pc),d7
  288.     beq    .out
  289.     lsr.l    #1,d7
  290.     bne.s    .in1
  291.     bra.s    .pass2
  292. .loop1:    move.w    (a0)+,d0
  293.     eor.w    d0,(a0)
  294. .in1:    subq.l    #1,d7
  295.     bne.s    .loop1
  296.  
  297.  
  298. .pass2:    move.l    Sourcelen(pc),d7        ;pass2 for encryption only
  299.     move.l    Buffer(pc),a0
  300.     lea    (a0,d7.l),a1
  301.     moveq    #cryptoffset,d3            ;user specified value
  302.     lea    (a0,d3.l),a2
  303.     bra.s    .chk2
  304. .loop2: eor.b    d7,(a2)
  305.     add.l    d3,a2
  306. .chk2:    move.l    a2,d2
  307.     sub.l    a1,d2
  308.     bmi.s    .in2
  309.     lea    (a0,d2.l),a2
  310.     bra.s    .chk2
  311. .in2:    subq.l    #1,d7
  312.     bne.s    .loop2
  313.  
  314.  
  315. .pass3:    move.l    PassWdStart(pc),a1        ;pass3 for de/encryption
  316.     move.l    a1,a2
  317.     moveq    #cryptoffset/3,d4        ;user specified value
  318. .prep:    move.b    (a2)+,d0
  319.     beq.s    0$
  320.     add.b    d0,d4
  321.     bra.s    .prep
  322.  
  323. 0$:    move.l    Buffer(pc),a0
  324.     moveq    #cryptoffset*2,d2        ;user specified start value
  325.     move.l    Sourcelen(pc),d7
  326. .loop3:    move.b    (a1)+,d0
  327.     bne.s    1$
  328.     move.l    PassWdStart(pc),a1
  329.     move.b    (a1)+,d0
  330.     subq.b    #cryptoffset/2,d2
  331. 1$:    add.b    d2,d0
  332.     add.b    #cryptoffset,d2
  333.     add.b    d4,d0
  334.     eor.b    d0,(a0)+
  335.     and.b    #cryptoffset,d0            ;user specified value
  336.     beq.s    2$
  337.     move.b    (a1),d0
  338.     eor.b    d0,d2
  339. 2$:    subq.l    #1,d7
  340.     bne.s    .loop3
  341.  
  342.  
  343.     tst.b    cryptflag(a5)
  344.     beq.s    .out
  345. .pass4:    move.l    Sourcelen(pc),d7        ;pass4 for decryption only
  346.     move.l    Buffer(pc),a0
  347.     lea    (a0,d7.l),a1
  348.     moveq    #cryptoffset,d3            ;user specified value
  349.     lea    (a0,d3.l),a2
  350.     bra.s    .chk4
  351. .loop4: eor.b    d7,(a2)
  352.     add.l    d3,a2
  353. .chk4:    move.l    a2,d2
  354.     sub.l    a1,d2
  355.     bmi.s    .in4
  356.     lea    (a0,d2.l),a2
  357.     bra.s    .chk4
  358. .in4:    subq.l    #1,d7
  359.     bne.s    .loop4
  360.  
  361.  
  362. .pass5:    move.l    Buffer(pc),a0            ;pass5 for decryption only
  363.     move.l    Sourcelen(pc),d7
  364.     beq.s    .out
  365.     lsr.l    #1,d7
  366.     beq.s    .out
  367.     add.l    d7,a0
  368.     add.l    d7,a0
  369.     bra.s    .in5
  370. .loop5:    move.w    -4(a0),d0
  371.     eor.w    d0,-(a0)
  372. .in5:    subq.l    #1,d7
  373.     bne.s    .loop5
  374.  
  375.  
  376. .out:    rts
  377.  
  378.  
  379.  
  380.  
  381. ;-------------------------------------------------------------------------------
  382. *
  383. * external routines
  384. *
  385. ;-------------------------------------------------------------------------------
  386.     include    startup4.r
  387.     include    dosfile.r
  388.  
  389.  
  390. ;-------------------------------------------------------------------------------
  391. *
  392. * data area
  393. *
  394. ;-------------------------------------------------------------------------------
  395.  
  396. Title:        dc.b    $9b,"1mCrypt",$9b,"0m - small encryption program v"
  397.         dc.b    version,$a
  398.         dc.b    "Written 1992 by Daniel Weber",$a,$a,0
  399. Usage:        dc.b    "Usage: ",$9b,"3mCrypt <password> <source file> "
  400.         dc.b    "<output file>",$9b,"0m",$a,0
  401. FileError1:    dc.b    "Couldn't open file '%s'.",$a,0
  402.  
  403. DeCryptTxt:    dc.b    "de"
  404. CryptTxt:    dc.b    "crypting file '%s' to '%s'.",$a,0
  405.         even
  406.  
  407. dxstart
  408. ;-------------------------------------------------------------------------------
  409. ArgStr:        dx.l    1        ;parameter line
  410. ArgLen:        dx.l    1        ;parameter line length
  411.  
  412. cryptflag:    dx.b    1        ;0: crypt   -: decrypt
  413.         aligndx.w
  414.  
  415. PassWdStart:    dx.l    1        ;pointer to password
  416. PassWdLength:    dx.l    1        ;length of password
  417.  
  418. Buffer:        dx.l    1        ;buffer address
  419. BufferSize:    dx.l    1        ;buffer size
  420.  
  421. Sourcefile:    dx.l    1        ;pointer to source file
  422. Sourcelen:    dx.l    1        ;length of source file
  423. Destfile:    dx.l    1        ;pointer to destination file
  424.  
  425.  
  426. rawlist:    dx.l    2        ;rawlist for RawDoFmt
  427. workbuffer:    dx.b    workspace    ;some workspace
  428.  
  429. ;-------------------------------------------------------------------------------
  430.         aligndx.w
  431. dxend:
  432.     end
  433.  
  434.